package com.qf.test;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;

/**
 * 测试shiro权限框架基本使用
 * @author mkr
 * @version V1.0
 * @Project java2203-mkr
 * @Package com.qf.test
 * @Description:
 * @Date 2022/6/13 10:57
 */
public class ShiroDemo {
    public static void main(String[] args) {

        //1、获取SecurityManager核心对象
        DefaultSecurityManager securityManager = new DefaultSecurityManager();

        //2、获取配置文件中的权限数据、用户数据、角色数据
        IniRealm iniRealm = new IniRealm();

        //3、将用户、角色、权限数据放入SecurityManager核心对象中
        securityManager.setRealm(iniRealm);

        //4、设置SecurityManagerUtils核心对象工具类
        SecurityUtils.setSecurityManager(securityManager);

        //5、得到Subject当前登录用户对象
        Subject subject = SecurityUtils.getSubject();

        //6、登录、封装AuthenticthinToken对象，模拟用户在页面输入用户名、密码
        AuthenticationToken token = new UsernamePasswordToken("zhangsan", "123456");

        //7、调用login登录方法、让shiro框架核心SecurityManager对象验证用户名、密码
        //   和配置文件或数据库中记录的用户名、密码是否一致，并进行权限校验
        try {
            subject.login(token);
            System.out.println("====登录成功====");

        //8、如果用户名、密码不对，抛出异常
        }catch (UnknownAccountException e){
            System.out.println("====用户名错误====");
        }catch (IncorrectCredentialsException e){
            System.out.println("====密码错误====");
        }catch (AuthenticationException e){
            System.out.println("====用户名错误====");
        }

        //9、如果用户名、密码正确，获取用户、角色、权限等框架中能够获取到的用户信息打印，登录成功
        System.out.println("==========判断用户角色数据==========");
        System.out.println("=====判断用户是否是管理员====="+ subject.hasRole("admin"));
        System.out.println("=====判断用户是否是开发者====="+ subject.hasRole("developer"));
        System.out.println("=====判断用户是否是XXX====="+ subject.hasRole("xxx"));

        System.out.println("==========判断用户权限数据====父模块:子模块:操作======" + subject.isPermitted("sys:user:add"));
        System.out.println("======判断当前用户是否有用户添加权限操作======" + subject.isPermitted("sys:user:add"));
        System.out.println("======判断当前用户是否有用户删除权限操作======" + subject.isPermitted("sys:user:del"));
        System.out.println("======判断当前用户是否有菜单添加权限操作======" + subject.isPermitted("sys:menu:add"));
        System.out.println("======判断当前用户是否有菜单删除权限操作======" + subject.isPermitted("sys:menu:del"));


    }
}
